#Loading the required libraries
library(readxl)
library(dplyr)

Attaching package: 㤼㸱dplyr㤼㸲

The following objects are masked from 㤼㸱package:stats㤼㸲:

    filter, lag

The following objects are masked from 㤼㸱package:base㤼㸲:

    intersect, setdiff, setequal, union
library(ggplot2)
library(lubridate)
library(randomForest)
randomForest 4.6-14
Type rfNews() to see new features/changes/bug fixes.

Attaching package: 㤼㸱randomForest㤼㸲

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    margin

The following object is masked from 㤼㸱package:dplyr㤼㸲:

    combine
library(caTools)
library(DT)
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
#read the vinted dataset
vData <- read.csv("C:\\Users\\sathy\\OneDrive\\Desktop\\product_ds_hw_data.csv")
head(vData)
#Display the structure of the Vinted Dataset
str(vData)
'data.frame':   553491 obs. of  32 variables:
 $ portal                          : Factor w/ 1 level "fr": 1 1 1 1 1 1 1 1 1 1 ...
 $ id                              : int  1957315772 1969950772 1151604772 1254610772 1295601772 1813580772 1962742772 1207880772 1659889672 1147012772 ...
 $ created_at                      : Factor w/ 469145 levels "2019-07-31 22:00:00",..: 336238 324654 333353 323583 325853 325329 329512 325415 322883 328637 ...
 $ user_id                         : int  110495371 120070572 110561981 110717202 120390572 100987881 100388152 120376851 110260572 110333331 ...
 $ listing_price_eur_fixed         : num  6 5 25 8 6 20 50 7 13.4 1 ...
 $ status                          : Factor w/ 5 levels "a. New with tags",..: 1 3 2 3 3 1 1 3 1 2 ...
 $ sale_time                       : Factor w/ 124213 levels "2019-07-31 22:19:09",..: 122541 NA 99114 NA NA 81733 53164 NA NA NA ...
 $ gmv_eur_fixed                   : num  4 NA 14.3 NA NA ...
 $ brand                           : Factor w/ 19881 levels "'47 MVP","! Vara",..: 7259 7438 3647 14320 13163 14954 4014 13447 17251 18318 ...
 $ brand_is_verified               : logi  TRUE TRUE TRUE TRUE TRUE FALSE ...
 $ declined_at                     : Factor w/ 11775 levels "2019-07-31 22:23:02",..: NA NA NA NA NA NA NA NA NA NA ...
 $ color_primary                   : Factor w/ 28 levels "APRICOT","BLACK",..: 27 12 2 4 2 NA 2 27 27 3 ...
 $ listing_quality_string          : Factor w/ 3 levels "Long description",..: NA NA 2 NA 3 3 3 NA NA 3 ...
 $ suggested_price_maximum         : num  10 2.7 8 4.25 10 NA 50 5 10 3 ...
 $ catalog_code_1                  : Factor w/ 3 levels "CHILDREN_NEW",..: 3 1 3 1 3 3 3 1 3 1 ...
 $ catalog_code_2                  : Factor w/ 29 levels "ACCESSORIES_JEWELLERY",..: 29 6 29 6 29 9 29 3 29 6 ...
 $ catalog_code_3                  : Factor w/ 237 levels "ACCESS_MOBILE",..: 183 157 209 186 204 159 204 185 44 30 ...
 $ catalog_code_4                  : Factor w/ 389 levels "A_LINE_SKIRTS",..: 186 NA 343 322 384 NA 383 264 298 11 ...
 $ catalog_code_5                  : Factor w/ 37 levels "34_SLEEVE_SWEATERS",..: NA NA NA NA NA NA NA NA NA NA ...
 $ gender                          : Factor w/ 5 levels "0","1","F","M",..: 3 NA 3 3 NA 3 3 3 3 3 ...
 $ country_code                    : Factor w/ 3 levels "BE","ES","FR": 1 1 3 3 3 3 3 3 2 3 ...
 $ lister_nth_listing              : int  997 21 241 32 22 39 176 1661 35 47 ...
 $ first_listing_local_date        : Factor w/ 2112 levels "2013-03-27","2013-03-28",..: 1666 2103 1792 1939 2103 1988 2006 1566 2103 1312 ...
 $ listing_platform                : Factor w/ 3 levels "android","iphone",..: 1 2 2 1 2 2 2 3 2 2 ...
 $ registration_platform           : Factor w/ 4 levels "android","iphone",..: 1 2 2 4 2 2 2 3 2 2 ...
 $ registration_local_date         : Factor w/ 2281 levels "2013-03-23","2013-03-27",..: 1835 2272 1951 2009 2272 1949 2175 1735 2272 1481 ...
 $ total_positive_feedback_count   : int  93 0 60 27 0 6 91 155 0 20 ...
 $ total_negative_feedback_count   : int  1 0 1 0 0 0 3 4 0 0 ...
 $ window_items_listed             : int  801 17 55 12 15 30 162 427 17 0 ...
 $ window_items_bought             : int  18 0 6 11 0 0 0 5 0 0 ...
 $ window_items_sold               : int  63 1 19 6 0 6 137 37 0 1 ...
 $ listings_in_first_7days_detailed: Factor w/ 9 levels "a. Didn't list over first 7d",..: 3 6 1 1 6 1 5 7 7 2 ...
#Converting the type of Created_at, sale_time and declined_at to date
vData$'created_at' <- as.Date(as.factor(vData$created_at))
vData$'sale_time' <- as.Date(as.factor(vData$sale_time))
vData$'declined_at' <- as.Date(as.factor(vData$declined_at))

#Calculating the time interval using lubricate package
time.interval <- vData$created_at %--% vData$sale_time
vData$sold_period <- as.duration(time.interval) / ddays(1)
vData$sold_period[is.na(vData$sold_period)] <- 0

#Create a feature loss(Cost Price - Selling Price)
vData$loss <- vData$listing_price_eur_fixed - vData$gmv_eur_fixed

#Creating new feature Happy to show if seller was happy & the seller is happy if the item is sold and the loss is zero.
vData$Happy = ifelse(vData$loss>0, "No", "Yes")

#Deriving a class attribute from sold period to say if the item was sold or not 
vData$sold = ifelse(vData$sold_period == 0,"No","Yes")

# Print Structure of the Data
summary(vData)
 portal            id              created_at            user_id         
 fr:553491   Min.   :1.032e+08   Min.   :2019-07-31   Min.   :     1202  
             1st Qu.:1.250e+09   1st Qu.:2019-08-10   1st Qu.:100559632  
             Median :1.500e+09   Median :2019-08-18   Median :110371451  
             Mean   :1.500e+09   Mean   :2019-08-16   Mean   :102119640  
             3rd Qu.:1.750e+09   3rd Qu.:2019-08-25   3rd Qu.:120194452  
             Max.   :2.000e+09   Max.   :2019-08-31   Max.   :120999902  
                                                                         
 listing_price_eur_fixed              status         sale_time         
 Min.   :   0.00         a. New with tags: 50107   Min.   :2019-07-31  
 1st Qu.:   3.00         b. New          : 91720   1st Qu.:2019-08-16  
 Median :   5.00         c. Mint         :316090   Median :2019-08-26  
 Mean   :  13.61         d. Very good    : 85553   Mean   :2019-08-29  
 3rd Qu.:  12.00         e. Good         : 10021   3rd Qu.:2019-09-06  
 Max.   :9000.00                                   Max.   :2019-10-30  
                                                   NA's   :393486      
 gmv_eur_fixed        brand        brand_is_verified  declined_at        
 Min.   :   0.0   Zara   : 21331   Mode :logical     Min.   :2019-07-31  
 1st Qu.:   2.5   H&M    : 17802   FALSE:179081      1st Qu.:2019-08-11  
 Median :   5.0   Kiabi  : 17676   TRUE :374410      Median :2019-08-19  
 Mean   :  11.9   Nike   : 10189                     Mean   :2019-08-19  
 3rd Qu.:  11.5   Adidas :  8283                     3rd Qu.:2019-08-26  
 Max.   :8999.0   (Other):358359                     Max.   :2019-10-30  
 NA's   :393486   NA's   :119851                     NA's   :538586      
 color_primary                             listing_quality_string
 BLACK  :128527   Long description                    : 48365    
 BLUE   : 58412   Long description, More than 2 photos: 67262    
 GREY   : 53302   More than 2 photos                  :168990    
 WHITE  : 48430   NA's                                :268874    
 PINK   : 25824                                                  
 (Other):201124                                                  
 NA's   : 37872                                                  
 suggested_price_maximum      catalog_code_1                 catalog_code_2  
 Min.   :  0.86          CHILDREN_NEW:198687   WOMENS               :219740  
 1st Qu.:  3.64          MENS        : 53281   GIRLS_NEW            : 84023  
 Median :  5.00          WOMEN_ROOT  :301523   BOYS_NEW             : 67658  
 Mean   :  9.77                                FOOTWEAR             : 33119  
 3rd Qu.: 10.00                                ACCESSORIES_JEWELLERY: 25291  
 Max.   :520.00                                TOYS_AND_GAMES_NEW   : 20558  
 NA's   :139351                                (Other)              :103102  
            catalog_code_3            catalog_code_4                catalog_code_5  
 TOPS_T_SHIRTS     : 69207   WOM_TOP_T_SHIRTS: 18245   W_LIGHTWEIGT_JACKETS:  3887  
 DRESSES           : 40364   SUMMER_DRESSES  : 11623   W_SWEATERS          :  2296  
 PULLOVERS_SWEATERS: 17184   TOPS_GIRLS_NEW  :  9609   KNITTED_SWEATERS    :  2201  
 COATS_JACKETS     : 16781   W_JACKETS       :  9577   LEATHER_JACKETS     :  1922  
 BOYS_SHIRTS       : 14853   TSHIRTS_BOYS_NEW:  9309   PARTY_DRESSES       :  1895  
 (Other)           :389313   (Other)         :386339   (Other)             : 13996  
 NA's              :  5789   NA's            :108789   NA's                :527294  
  gender       country_code lister_nth_listing first_listing_local_date
 0   :     3   BE: 48874    Min.   :   1.0     2019-08-18:  5382       
 1   :    60   ES: 23795    1st Qu.:  24.0     2019-08-11:  5016       
 F   :491901   FR:480822    Median :  79.0     2019-08-25:  4730       
 M   : 30379                Mean   : 269.1     2019-08-12:  4629       
 O   :   525                3rd Qu.: 234.0     2019-08-15:  4464       
 NA's: 30623                Max.   :9883.0     2019-08-20:  4274       
                                               (Other)   :524996       
               listing_platform             registration_platform
 android               :245554   android               :196879   
 iphone                :258894   iphone                :217151   
 web (desktop or other): 49043   mobile web            : 49068   
                                 web (desktop or other): 90393   
                                                                 
                                                                 
                                                                 
 registration_local_date total_positive_feedback_count total_negative_feedback_count
 2019-08-11:  2984       Min.   :   0.00               Min.   :  0.000              
 2019-08-25:  2858       1st Qu.:   1.00               1st Qu.:  0.000              
 2019-08-18:  2767       Median :  12.00               Median :  0.000              
 2019-08-10:  2666       Mean   :  56.76               Mean   :  1.215              
 2019-08-14:  2645       3rd Qu.:  51.00               3rd Qu.:  1.000              
 2019-08-12:  2573       Max.   :3621.00               Max.   :108.000              
 (Other)   :536998                                                                  
 window_items_listed window_items_bought window_items_sold
 Min.   :   0.00     Min.   :  0.000     Min.   :  0.00   
 1st Qu.:   3.00     1st Qu.:  0.000     1st Qu.:  0.00   
 Median :  23.00     Median :  1.000     Median :  4.00   
 Mean   :  79.11     Mean   :  6.601     Mean   : 15.09   
 3rd Qu.:  74.00     3rd Qu.:  6.000     3rd Qu.: 15.00   
 Max.   :2676.00     Max.   :684.000     Max.   :774.00   
                                                          
             listings_in_first_7days_detailed  sold_period          loss        
 a. Didn't list over first 7d:264575          Min.   : 0.000   Min.   :-1000.0  
 c. 2-5 listings             : 64431          1st Qu.: 0.000   1st Qu.:    0.0  
 f. 21-50 listings           : 57305          Median : 0.000   Median :    0.3  
 e. 11-20 listings           : 50474          Mean   : 3.721   Mean   :    2.0  
 d. 6-10 listings            : 46104          3rd Qu.: 0.000   3rd Qu.:    2.0  
 b. 1 listing                : 33501          Max.   :90.000   Max.   : 3670.0  
 (Other)                     : 37101                           NA's   :393486   
    Happy               sold          
 Length:553491      Length:553491     
 Class :character   Class :character  
 Mode  :character   Mode  :character  
                                      
                                      
                                      
                                      
#Plot Proportion of items with respect to Status
ggplot(vData, aes(status))+
  geom_bar(aes(fill = status))+
   scale_x_discrete(labels= c("New with tags", "New", "Satisfactory","Very Good","Good"))+
  scale_y_discrete()+
  ggtitle("Proportion of Items listed with specific status")+
  theme(legend.position = "none")

##The items having satisfactory status are listed more compared to other status.

genders <- filter(vData, gender == "M" |  gender == "F" | gender == "O")
ggplot(genders, aes(gender))+
  geom_bar(aes(fill = gender))+
  ggtitle("Proportion of seller based on Gender")+
  theme(axis.text.y = element_blank(),legend.position = "none")

##The Count of Female sellers are more than male and others.

#Creating  a table to summarize data with respect to country
country <- vData %>% group_by(country_code) %>%
  dplyr::summarise(Total = n())
`summarise()` ungrouping output (override with `.groups` argument)
datatable(country)

#Plot pie plot to show the proportion of sellers in country
ggplot(country, aes(x = "",y = Total,fill = country_code))+
  geom_bar(stat="identity", width=1,color="black")+
   coord_polar("y", start=0)+
  ggtitle("Proportion of Seller based on Country")+
  theme_void()+
  scale_fill_brewer(palette="Set2")

##The percentage of sellers are more in France compared to other two country.

#Create a subset of vinted data with colour and sold period attribute
dt1 <- subset(vData, select = c(status,sold_period))
dt1 <- na.omit(dt1)
#Creating a table by grouping status and summarizing the mean window period
dt1 <- dt1 %>%
  group_by(status) %>%
  dplyr::summarise(MeanPeriod = mean(sold_period))
`summarise()` ungrouping output (override with `.groups` argument)
datatable(dt1)

#Plot the  mean window period between item posted date and sold date
plot(dt1,main = "The Mean Window Period between item posted and sold")

##The plot depicts that the new items with tags sold are having more window period when compared to other status. ##This can be due to the high rate, as new products are better than second hand product though it as tag, and it would certainly have the same price. ##Further, The good and very good items are are sold with less window period.

#Create a subset of vinted data with colour and sold period attribute
dt2 <- subset(vData, select = c(color_primary,sold_period))
dt2 <- na.omit(dt2)
#Creating the datable with above subset data
dt2 <- dt2 %>%
  group_by(color_primary) %>%
  dplyr::summarise(MeanPeriod = mean(sold_period))
`summarise()` ungrouping output (override with `.groups` argument)
datatable(dt2)

#Plot the window period with respect to colour
ggplot(dt2,aes(color_primary,MeanPeriod,color = color_primary))+
  geom_point()+
  theme(axis.text.x = element_text(angle = 90))+
  theme(legend.position = "none")

##As the plot depicts, the basic colours like blue, green , red , white , yellow etc,. are having less window period when compared to colours like burgandy , brown, purple and lilac.

#Creating a subset of Vinted data 
vvData <- subset(vData, select = -c(portal,declined_at,first_listing_local_date,registration_platform,registration_local_date,window_items_listed,window_items_bought,window_items_sold,listings_in_first_7days_detailed,loss))
vvData <- na.omit(vvData)
#remove NA values
dim(vvData)
[1] 3907   26
#Plot status and group by sold or not
ggplot(vvData,aes(status))+
  geom_bar(aes(fill=sold))

##The plot shows that the satisfactory(mint) items are listed and sold in large proportion when compared to other items. And new items with tags and good items are having very less proportion of items not sold. Status is not having much impact accopording to the plot

#Plot Status grouped by Happy or not
ggplot(vvData,aes(status))+
  geom_bar(aes(fill=Happy))+
  ggtitle("Count of Status grouped by Happy or Not")

##The graph emphasises that every status is facing greater than or equal to 50 percent loss. which means it is sold lesser than the listed price.

#Plot listing quality string grouped by sold or not
ggplot(vData,aes(listing_quality_string, xlab = " Quality of string listed"))+
  geom_bar(aes(fill=sold))+
  ggtitle("Count of Items based on quality of listed string")+
  scale_x_discrete(labels = c("Long Description", "Long Description with more than 2 photos", "More than 2 photos", "No Descrition"))+
  theme(axis.text.x = element_text(angle = 90))+
  scale_y_discrete()

##The graph proves that the item with no description are having less chances to be sold. The items with long descriotion and more than 2 photos have comparitively high sold rate.

#Plot  items count based on catalog category 1
ggplot(vData,aes(catalog_code_1))+
  theme(axis.text.x = element_text(angle = 90))+
  geom_bar(aes(fill=sold))

#Plot  items count based on catalog category 2
ggplot(vData,aes(catalog_code_2))+
  theme(axis.text.x = element_text(angle = 90))+
  geom_bar(aes(fill=sold))

#Plot  items count based on catalog category 3
ggplot(vvData,aes(catalog_code_3))+
  theme(axis.text.x = element_text(angle = 90))+
  geom_bar(aes(fill=sold))

#Plot  items count based on catalog category 4
ggplot(vvData,aes(catalog_code_4))+
  theme(axis.text.x = element_text(angle = 90))+
  geom_bar(aes(fill=sold))

#Plot  items count based on catalog category 5
ggplot(vvData,aes(catalog_code_5))+
  theme(axis.text.x = element_text(angle = 90))+
  geom_bar(aes(fill=sold))

##Most of the sellers are women as depicted from past graphs. Here we see most of the women _root items are not sold. Though men wear has less listings, the sold rate is nearly equal to women and children wear which is around 25 percent.

#Create a subset of data to find if seller is HAPPY or NOT
newData <- subset(vData, select = -c(portal,id,sale_time, declined_at,first_listing_local_date,registration_platform,registration_local_date,window_items_listed,window_items_bought,window_items_sold,listings_in_first_7days_detailed,loss,sold))
#Remove NA values
newData <- na.omit(newData)
#Type conversion
newData$Happy <- as.factor(as.character(newData$Happy))
newData$status <- as.integer(as.factor(newData$status))
newData$brand <- as.integer(as.factor(newData$brand))
newData$brand_is_verified <- as.integer(as.factor(newData$brand_is_verified))
newData$listing_quality_string <- as.integer(as.factor(newData$listing_quality_string))
newData$catalog_code_1 <- as.integer(as.factor(newData$catalog_code_1))
newData$catalog_code_2 <- as.integer(as.factor(newData$catalog_code_2))
newData$catalog_code_3 <- as.integer(as.factor(newData$catalog_code_3))
newData$catalog_code_4 <- as.integer(as.factor(newData$catalog_code_4))
newData$catalog_code_5 <- as.integer(as.factor(newData$catalog_code_5))
newData$listing_platform <- as.integer(as.factor(newData$listing_platform))
newData$gender <- as.integer(as.factor(newData$gender))
newData$color_primary <- as.integer(as.factor(newData$color_primary))
newData$country_code <- as.integer(as.factor(newData$country_code))
#Print Summary of new subset data
summary(newData)
   created_at            user_id          listing_price_eur_fixed     status     
 Min.   :2019-07-31   Min.   :    10035   Min.   :   0.00         Min.   :1.000  
 1st Qu.:2019-08-11   1st Qu.:100465451   1st Qu.:   6.00         1st Qu.:3.000  
 Median :2019-08-18   Median :110266831   Median :  11.00         Median :3.000  
 Mean   :2019-08-17   Mean   : 97211181   Mean   :  21.75         Mean   :2.856  
 3rd Qu.:2019-08-25   3rd Qu.:120095071   3rd Qu.:  25.00         3rd Qu.:3.000  
 Max.   :2019-08-31   Max.   :120996822   Max.   :2220.00         Max.   :5.000  
 gmv_eur_fixed           brand       brand_is_verified color_primary   
 Min.   :   0.0388   Min.   :    4   Min.   :1.000     Min.   : 2.000  
 1st Qu.:   5.0000   1st Qu.: 5476   1st Qu.:2.000     1st Qu.: 2.000  
 Median :  10.0000   Median :10334   Median :2.000     Median : 5.000  
 Mean   :  18.2342   Mean   :10612   Mean   :1.936     Mean   : 9.947  
 3rd Qu.:  20.0000   3rd Qu.:15131   3rd Qu.:2.000     3rd Qu.:18.000  
 Max.   :2100.0000   Max.   :19850   Max.   :2.000     Max.   :28.000  
 listing_quality_string suggested_price_maximum catalog_code_1 catalog_code_2
 Min.   :1.000          Min.   :  2.40          Min.   :3      Min.   :29    
 1st Qu.:2.000          1st Qu.:  5.00          1st Qu.:3      1st Qu.:29    
 Median :3.000          Median :  8.00          Median :3      Median :29    
 Mean   :2.492          Mean   : 11.09          Mean   :3      Mean   :29    
 3rd Qu.:3.000          3rd Qu.: 11.04          3rd Qu.:3      3rd Qu.:29    
 Max.   :3.000          Max.   :269.00          Max.   :3      Max.   :29    
 catalog_code_3   catalog_code_4  catalog_code_5      gender       country_code  
 Min.   : 38.00   Min.   :156.0   Min.   : 1.00   Min.   :2.000   Min.   :1.000  
 1st Qu.: 38.00   1st Qu.:329.0   1st Qu.:10.00   1st Qu.:3.000   1st Qu.:3.000  
 Median : 38.00   Median :333.0   Median :18.00   Median :3.000   Median :3.000  
 Mean   : 71.85   Mean   :319.5   Mean   :20.16   Mean   :3.016   Mean   :2.778  
 3rd Qu.:169.00   3rd Qu.:335.0   3rd Qu.:30.50   3rd Qu.:3.000   3rd Qu.:3.000  
 Max.   :192.00   Max.   :373.0   Max.   :37.00   Max.   :5.000   Max.   :3.000  
 lister_nth_listing listing_platform total_positive_feedback_count
 Min.   :   1.0     Min.   :1.000    Min.   :   0.0               
 1st Qu.:  28.0     1st Qu.:1.000    1st Qu.:   3.0               
 Median :  78.0     Median :2.000    Median :  17.0               
 Mean   : 291.8     Mean   :1.706    Mean   : 109.1               
 3rd Qu.: 212.0     3rd Qu.:2.000    3rd Qu.:  65.0               
 Max.   :9868.0     Max.   :3.000    Max.   :3557.0               
 total_negative_feedback_count  sold_period    Happy     
 Min.   : 0.000                Min.   : 0.00   No :2308  
 1st Qu.: 0.000                1st Qu.: 1.00   Yes:1599  
 Median : 0.000                Median : 7.00             
 Mean   : 1.944                Mean   :15.85             
 3rd Qu.: 1.000                3rd Qu.:25.00             
 Max.   :71.000                Max.   :88.00             
#Split the data into train and test set
sample = sample.split(newData$Happy, SplitRatio = .70)
train = subset(newData, sample == TRUE)
test  = subset(newData, sample == FALSE)
#Train the model using train data
rf <- randomForest(Happy ~ ., data=train)
rf

Call:
 randomForest(formula = Happy ~ ., data = train) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 4

        OOB estimate of  error rate: 20.33%
Confusion matrix:
      No Yes class.error
No  1446 170   0.1051980
Yes  386 733   0.3449508
#Plot the Random Forest Error
plot(rf, main = "Random Forest Error")

#Plot the Variable Importance Plot
varImpPlot(rf, bg = "skyblue", main = "Variable Importance Plot in terms of HAPPY or NOT")

##The listing price,deal accepeted price, sold period, the positive feedcount plays a major role in deciding if the seller was HAPPY or NOT.

#Create a subet of data to classify if Items where SOLD or NOT
sData <- subset(vData, select = -c(portal,declined_at,first_listing_local_date,registration_platform,registration_local_date,window_items_listed,window_items_bought,window_items_sold,listings_in_first_7days_detailed,loss,id,created_at,sale_time,sold_period,Happy))
#remove na values
sData <- na.omit(sData)
#type conversions
sData$sold <- as.factor(as.character(sData$sold))
sData$status <- as.integer(as.factor(sData$status))
sData$brand <- as.integer(as.factor(sData$brand))
sData$brand_is_verified <- as.integer(as.factor(sData$brand_is_verified))
sData$listing_quality_string <- as.integer(as.factor(sData$listing_quality_string))
sData$catalog_code_1 <- as.integer(as.factor(sData$catalog_code_1))
sData$catalog_code_2 <- as.integer(as.factor(sData$catalog_code_2))
sData$catalog_code_3 <- as.integer(as.factor(sData$catalog_code_3))
sData$catalog_code_4 <- as.integer(as.factor(sData$catalog_code_4))
sData$catalog_code_5 <- as.integer(as.factor(sData$catalog_code_5))
sData$listing_platform <- as.integer(as.factor(sData$listing_platform))
sData$gender <- as.integer(as.factor(sData$gender))
sData$color_primary <- as.integer(as.factor(sData$color_primary))
sData$country_code <- as.integer(as.factor(sData$country_code))
#split the data into train and test set
sample = sample.split(sData$sold, SplitRatio = .70)
train = subset(sData, sample == TRUE)
test  = subset(sData, sample == FALSE)
#train the model
rf2 <- randomForest(sold ~ ., data=train)
#plot the variable importance plot
varImpPlot(rf2,bg = "skyblue", main = "Variable Importance Plot in terms of SOLD or NOT")

##The Experience(lister_nth_listing), total positive feedback count, the cost price and brand are the Primary factors which decided if the item was sold or not. The secondary factors are the catalog category, color, negative feedback count, status and quality of listing string.

##############################################################################################Therefore, The seller must maintain a good feedback record, mention a genuine price. It would be appreciated if teh seller can give long description with more than 2 photos. This way the liquidity can be increased.

Thank You

LS0tDQp0aXRsZTogIlZpbnRlZCBEYXRhIFNjaWVudGlzdCBJbnRlcm5zaGlwIEhvbWV3b3JrIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQphdXRob3I6ICJTYXRoeWEgU3VkaGEgTXVydWdhbiINCi0tLQ0KLS0tDQojIyBHb2FsIDwtIFRvIG1ha2UgdGhlIHNlbGxlciBoYXBweQ0KIyMgUHJvYmxlbSBTdGF0ZW1lbnQgPC0gV2hpY2ggZmFjdG9ycyBhZmZlY3QgdGhlIGxpcXVpZGl0eQ0KIyMgRGVmaW5pdGlvbjoNCiMjICAgIExpcXVpZGl0eSA8LSBIb3cgcXVpY2tseSB0aGUgc2VsbGVyIHNlbGxzIGhpcyBwcm9kdWN0IHdpdGggbm8gb3IgbWluaW1hbCBsb3NzLg0KLS0tDQoNCmBgYHtyfQ0KI0xvYWRpbmcgdGhlIHJlcXVpcmVkIGxpYnJhcmllcw0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkNCmxpYnJhcnkoY2FUb29scykNCmxpYnJhcnkoRFQpDQpgYGANCmBgYHtyfQ0KI3JlYWQgdGhlIHZpbnRlZCBkYXRhc2V0DQp2RGF0YSA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxzYXRoeVxcT25lRHJpdmVcXERlc2t0b3BcXHByb2R1Y3RfZHNfaHdfZGF0YS5jc3YiKQ0KaGVhZCh2RGF0YSkNCmBgYA0KDQoNCmBgYHtyfQ0KI0Rpc3BsYXkgdGhlIHN0cnVjdHVyZSBvZiB0aGUgVmludGVkIERhdGFzZXQNCnN0cih2RGF0YSkNCmBgYA0KDQpgYGB7cn0NCiNDb252ZXJ0aW5nIHRoZSB0eXBlIG9mIENyZWF0ZWRfYXQsIHNhbGVfdGltZSBhbmQgZGVjbGluZWRfYXQgdG8gZGF0ZQ0KdkRhdGEkJ2NyZWF0ZWRfYXQnIDwtIGFzLkRhdGUoYXMuZmFjdG9yKHZEYXRhJGNyZWF0ZWRfYXQpKQ0KdkRhdGEkJ3NhbGVfdGltZScgPC0gYXMuRGF0ZShhcy5mYWN0b3IodkRhdGEkc2FsZV90aW1lKSkNCnZEYXRhJCdkZWNsaW5lZF9hdCcgPC0gYXMuRGF0ZShhcy5mYWN0b3IodkRhdGEkZGVjbGluZWRfYXQpKQ0KDQojQ2FsY3VsYXRpbmcgdGhlIHRpbWUgaW50ZXJ2YWwgdXNpbmcgbHVicmljYXRlIHBhY2thZ2UNCnRpbWUuaW50ZXJ2YWwgPC0gdkRhdGEkY3JlYXRlZF9hdCAlLS0lIHZEYXRhJHNhbGVfdGltZQ0KdkRhdGEkc29sZF9wZXJpb2QgPC0gYXMuZHVyYXRpb24odGltZS5pbnRlcnZhbCkgLyBkZGF5cygxKQ0KdkRhdGEkc29sZF9wZXJpb2RbaXMubmEodkRhdGEkc29sZF9wZXJpb2QpXSA8LSAwDQoNCiNDcmVhdGUgYSBmZWF0dXJlIGxvc3MoQ29zdCBQcmljZSAtIFNlbGxpbmcgUHJpY2UpDQp2RGF0YSRsb3NzIDwtIHZEYXRhJGxpc3RpbmdfcHJpY2VfZXVyX2ZpeGVkIC0gdkRhdGEkZ212X2V1cl9maXhlZA0KDQojQ3JlYXRpbmcgbmV3IGZlYXR1cmUgSGFwcHkgdG8gc2hvdyBpZiBzZWxsZXIgd2FzIGhhcHB5ICYgdGhlIHNlbGxlciBpcyBoYXBweSBpZiB0aGUgaXRlbSBpcyBzb2xkIGFuZCB0aGUgbG9zcyBpcyB6ZXJvLg0KdkRhdGEkSGFwcHkgPSBpZmVsc2UodkRhdGEkbG9zcz4wLCAiTm8iLCAiWWVzIikNCg0KI0Rlcml2aW5nIGEgY2xhc3MgYXR0cmlidXRlIGZyb20gc29sZCBwZXJpb2QgdG8gc2F5IGlmIHRoZSBpdGVtIHdhcyBzb2xkIG9yIG5vdCANCnZEYXRhJHNvbGQgPSBpZmVsc2UodkRhdGEkc29sZF9wZXJpb2QgPT0gMCwiTm8iLCJZZXMiKQ0KDQojIFByaW50IFN0cnVjdHVyZSBvZiB0aGUgRGF0YQ0Kc3VtbWFyeSh2RGF0YSkNCmBgYA0KDQpgYGB7cn0NCiNQbG90IFByb3BvcnRpb24gb2YgaXRlbXMgd2l0aCByZXNwZWN0IHRvIFN0YXR1cw0KZ2dwbG90KHZEYXRhLCBhZXMoc3RhdHVzKSkrDQogIGdlb21fYmFyKGFlcyhmaWxsID0gc3RhdHVzKSkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz0gYygiTmV3IHdpdGggdGFncyIsICJOZXciLCAiU2F0aXNmYWN0b3J5IiwiVmVyeSBHb29kIiwiR29vZCIpKSsNCiAgc2NhbGVfeV9kaXNjcmV0ZSgpKw0KICBnZ3RpdGxlKCJQcm9wb3J0aW9uIG9mIEl0ZW1zIGxpc3RlZCB3aXRoIHNwZWNpZmljIHN0YXR1cyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCg0KIyNUaGUgaXRlbXMgaGF2aW5nIHNhdGlzZmFjdG9yeSBzdGF0dXMgYXJlIGxpc3RlZCBtb3JlIGNvbXBhcmVkIHRvIG90aGVyIHN0YXR1cy4NCg0KYGBge3J9DQpnZW5kZXJzIDwtIGZpbHRlcih2RGF0YSwgZ2VuZGVyID09ICJNIiB8ICBnZW5kZXIgPT0gIkYiIHwgZ2VuZGVyID09ICJPIikNCmdncGxvdChnZW5kZXJzLCBhZXMoZ2VuZGVyKSkrDQogIGdlb21fYmFyKGFlcyhmaWxsID0gZ2VuZGVyKSkrDQogIGdndGl0bGUoIlByb3BvcnRpb24gb2Ygc2VsbGVyIGJhc2VkIG9uIEdlbmRlciIpKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSxsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCiMjVGhlIENvdW50IG9mIEZlbWFsZSBzZWxsZXJzIGFyZSBtb3JlIHRoYW4gbWFsZSBhbmQgb3RoZXJzLg0KDQpgYGB7cn0NCiNDcmVhdGluZyAgYSB0YWJsZSB0byBzdW1tYXJpemUgZGF0YSB3aXRoIHJlc3BlY3QgdG8gY291bnRyeQ0KY291bnRyeSA8LSB2RGF0YSAlPiUgZ3JvdXBfYnkoY291bnRyeV9jb2RlKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZShUb3RhbCA9IG4oKSkNCmRhdGF0YWJsZShjb3VudHJ5KQ0KI1Bsb3QgcGllIHBsb3QgdG8gc2hvdyB0aGUgcHJvcG9ydGlvbiBvZiBzZWxsZXJzIGluIGNvdW50cnkNCmdncGxvdChjb3VudHJ5LCBhZXMoeCA9ICIiLHkgPSBUb3RhbCxmaWxsID0gY291bnRyeV9jb2RlKSkrDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9MSxjb2xvcj0iYmxhY2siKSsNCiAgIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQ9MCkrDQogIGdndGl0bGUoIlByb3BvcnRpb24gb2YgU2VsbGVyIGJhc2VkIG9uIENvdW50cnkiKSsNCiAgdGhlbWVfdm9pZCgpKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTZXQyIikNCmBgYA0KIyNUaGUgcGVyY2VudGFnZSBvZiBzZWxsZXJzIGFyZSBtb3JlIGluIEZyYW5jZSBjb21wYXJlZCB0byBvdGhlciB0d28gY291bnRyeS4NCg0KYGBge3J9DQojQ3JlYXRlIGEgc3Vic2V0IG9mIHZpbnRlZCBkYXRhIHdpdGggY29sb3VyIGFuZCBzb2xkIHBlcmlvZCBhdHRyaWJ1dGUNCmR0MSA8LSBzdWJzZXQodkRhdGEsIHNlbGVjdCA9IGMoc3RhdHVzLHNvbGRfcGVyaW9kKSkNCmR0MSA8LSBuYS5vbWl0KGR0MSkNCiNDcmVhdGluZyBhIHRhYmxlIGJ5IGdyb3VwaW5nIHN0YXR1cyBhbmQgc3VtbWFyaXppbmcgdGhlIG1lYW4gd2luZG93IHBlcmlvZA0KZHQxIDwtIGR0MSAlPiUNCiAgZ3JvdXBfYnkoc3RhdHVzKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZShNZWFuUGVyaW9kID0gbWVhbihzb2xkX3BlcmlvZCkpDQpkYXRhdGFibGUoZHQxKQ0KI1Bsb3QgdGhlICBtZWFuIHdpbmRvdyBwZXJpb2QgYmV0d2VlbiBpdGVtIHBvc3RlZCBkYXRlIGFuZCBzb2xkIGRhdGUNCnBsb3QoZHQxLG1haW4gPSAiVGhlIE1lYW4gV2luZG93IFBlcmlvZCBiZXR3ZWVuIGl0ZW0gcG9zdGVkIGFuZCBzb2xkIikNCmBgYA0KIyNUaGUgcGxvdCBkZXBpY3RzIHRoYXQgdGhlIG5ldyBpdGVtcyB3aXRoIHRhZ3Mgc29sZCBhcmUgaGF2aW5nIG1vcmUgd2luZG93IHBlcmlvZCB3aGVuIGNvbXBhcmVkIHRvIG90aGVyIHN0YXR1cy4gDQojI1RoaXMgY2FuIGJlIGR1ZSB0byB0aGUgaGlnaCByYXRlLCBhcyBuZXcgcHJvZHVjdHMgYXJlIGJldHRlciB0aGFuIHNlY29uZCBoYW5kIHByb2R1Y3QgdGhvdWdoIGl0IGFzIHRhZywgYW5kIGl0IHdvdWxkIGNlcnRhaW5seSBoYXZlIHRoZSBzYW1lIHByaWNlLg0KIyNGdXJ0aGVyLCBUaGUgZ29vZCBhbmQgdmVyeSBnb29kIGl0ZW1zIGFyZSBhcmUgc29sZCB3aXRoIGxlc3Mgd2luZG93IHBlcmlvZC4NCmBgYHtyfQ0KI0NyZWF0ZSBhIHN1YnNldCBvZiB2aW50ZWQgZGF0YSB3aXRoIGNvbG91ciBhbmQgc29sZCBwZXJpb2QgYXR0cmlidXRlDQpkdDIgPC0gc3Vic2V0KHZEYXRhLCBzZWxlY3QgPSBjKGNvbG9yX3ByaW1hcnksc29sZF9wZXJpb2QpKQ0KZHQyIDwtIG5hLm9taXQoZHQyKQ0KI0NyZWF0aW5nIHRoZSBkYXRhYmxlIHdpdGggYWJvdmUgc3Vic2V0IGRhdGENCmR0MiA8LSBkdDIgJT4lDQogIGdyb3VwX2J5KGNvbG9yX3ByaW1hcnkpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXNlKE1lYW5QZXJpb2QgPSBtZWFuKHNvbGRfcGVyaW9kKSkNCmRhdGF0YWJsZShkdDIpDQojUGxvdCB0aGUgd2luZG93IHBlcmlvZCB3aXRoIHJlc3BlY3QgdG8gY29sb3VyDQpnZ3Bsb3QoZHQyLGFlcyhjb2xvcl9wcmltYXJ5LE1lYW5QZXJpb2QsY29sb3IgPSBjb2xvcl9wcmltYXJ5KSkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCg0KIyNBcyB0aGUgcGxvdCBkZXBpY3RzLCB0aGUgYmFzaWMgY29sb3VycyBsaWtlIGJsdWUsIGdyZWVuICwgcmVkICwgd2hpdGUgLCB5ZWxsb3cgZXRjLC4gYXJlIGhhdmluZyBsZXNzIHdpbmRvdyBwZXJpb2Qgd2hlbiBjb21wYXJlZCB0byBjb2xvdXJzIGxpa2UgYnVyZ2FuZHkgLCBicm93biwgcHVycGxlIGFuZCBsaWxhYy4NCg0KYGBge3J9DQojQ3JlYXRpbmcgYSBzdWJzZXQgb2YgVmludGVkIGRhdGEgDQp2dkRhdGEgPC0gc3Vic2V0KHZEYXRhLCBzZWxlY3QgPSAtYyhwb3J0YWwsZGVjbGluZWRfYXQsZmlyc3RfbGlzdGluZ19sb2NhbF9kYXRlLHJlZ2lzdHJhdGlvbl9wbGF0Zm9ybSxyZWdpc3RyYXRpb25fbG9jYWxfZGF0ZSx3aW5kb3dfaXRlbXNfbGlzdGVkLHdpbmRvd19pdGVtc19ib3VnaHQsd2luZG93X2l0ZW1zX3NvbGQsbGlzdGluZ3NfaW5fZmlyc3RfN2RheXNfZGV0YWlsZWQsbG9zcykpDQp2dkRhdGEgPC0gbmEub21pdCh2dkRhdGEpDQojcmVtb3ZlIE5BIHZhbHVlcw0KZGltKHZ2RGF0YSkNCg0KYGBgDQpgYGB7cn0NCiNQbG90IHN0YXR1cyBhbmQgZ3JvdXAgYnkgc29sZCBvciBub3QNCmdncGxvdCh2dkRhdGEsYWVzKHN0YXR1cykpKw0KICBnZW9tX2JhcihhZXMoZmlsbD1zb2xkKSkNCmBgYA0KIyNUaGUgcGxvdCBzaG93cyB0aGF0IHRoZSBzYXRpc2ZhY3RvcnkobWludCkgaXRlbXMgYXJlIGxpc3RlZCBhbmQgc29sZCBpbiBsYXJnZSBwcm9wb3J0aW9uIHdoZW4gY29tcGFyZWQgdG8gb3RoZXIgaXRlbXMuIEFuZCBuZXcgaXRlbXMgd2l0aCB0YWdzICBhbmQgZ29vZCBpdGVtcyBhcmUgaGF2aW5nIHZlcnkgbGVzcyBwcm9wb3J0aW9uIG9mIGl0ZW1zIG5vdCBzb2xkLg0KU3RhdHVzIGlzIG5vdCBoYXZpbmcgbXVjaCBpbXBhY3QgYWNjb3BvcmRpbmcgdG8gdGhlIHBsb3QNCmBgYHtyfQ0KI1Bsb3QgU3RhdHVzIGdyb3VwZWQgYnkgSGFwcHkgb3Igbm90DQpnZ3Bsb3QodnZEYXRhLGFlcyhzdGF0dXMpKSsNCiAgZ2VvbV9iYXIoYWVzKGZpbGw9SGFwcHkpKSsNCiAgZ2d0aXRsZSgiQ291bnQgb2YgU3RhdHVzIGdyb3VwZWQgYnkgSGFwcHkgb3IgTm90IikNCmBgYA0KIyNUaGUgZ3JhcGggZW1waGFzaXNlcyB0aGF0IGV2ZXJ5IHN0YXR1cyBpcyBmYWNpbmcgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUwIHBlcmNlbnQgbG9zcy4gd2hpY2ggbWVhbnMgaXQgaXMgc29sZCBsZXNzZXIgdGhhbiB0aGUgbGlzdGVkIHByaWNlLg0KYGBge3J9DQojUGxvdCBsaXN0aW5nIHF1YWxpdHkgc3RyaW5nIGdyb3VwZWQgYnkgc29sZCBvciBub3QNCmdncGxvdCh2RGF0YSxhZXMobGlzdGluZ19xdWFsaXR5X3N0cmluZywgeGxhYiA9ICIgUXVhbGl0eSBvZiBzdHJpbmcgbGlzdGVkIikpKw0KICBnZW9tX2JhcihhZXMoZmlsbD1zb2xkKSkrDQogIGdndGl0bGUoIkNvdW50IG9mIEl0ZW1zIGJhc2VkIG9uIHF1YWxpdHkgb2YgbGlzdGVkIHN0cmluZyIpKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoIkxvbmcgRGVzY3JpcHRpb24iLCAiTG9uZyBEZXNjcmlwdGlvbiB3aXRoIG1vcmUgdGhhbiAyIHBob3RvcyIsICJNb3JlIHRoYW4gMiBwaG90b3MiLCAiTm8gRGVzY3JpdGlvbiIpKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBzY2FsZV95X2Rpc2NyZXRlKCkNCmBgYA0KIyNUaGUgZ3JhcGggcHJvdmVzIHRoYXQgdGhlIGl0ZW0gd2l0aCBubyBkZXNjcmlwdGlvbiBhcmUgaGF2aW5nIGxlc3MgY2hhbmNlcyB0byBiZSBzb2xkLg0KIFRoZSBpdGVtcyB3aXRoIGxvbmcgZGVzY3Jpb3Rpb24gYW5kIG1vcmUgdGhhbiAyIHBob3RvcyBoYXZlIGNvbXBhcml0aXZlbHkgaGlnaCBzb2xkIHJhdGUuDQoNCmBgYHtyfQ0KI1Bsb3QgIGl0ZW1zIGNvdW50IGJhc2VkIG9uIGNhdGFsb2cgY2F0ZWdvcnkgMQ0KZ2dwbG90KHZEYXRhLGFlcyhjYXRhbG9nX2NvZGVfMSkpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIGdlb21fYmFyKGFlcyhmaWxsPXNvbGQpKQ0KI1Bsb3QgIGl0ZW1zIGNvdW50IGJhc2VkIG9uIGNhdGFsb2cgY2F0ZWdvcnkgMg0KZ2dwbG90KHZEYXRhLGFlcyhjYXRhbG9nX2NvZGVfMikpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIGdlb21fYmFyKGFlcyhmaWxsPXNvbGQpKQ0KI1Bsb3QgIGl0ZW1zIGNvdW50IGJhc2VkIG9uIGNhdGFsb2cgY2F0ZWdvcnkgMw0KZ2dwbG90KHZ2RGF0YSxhZXMoY2F0YWxvZ19jb2RlXzMpKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBnZW9tX2JhcihhZXMoZmlsbD1zb2xkKSkNCiNQbG90ICBpdGVtcyBjb3VudCBiYXNlZCBvbiBjYXRhbG9nIGNhdGVnb3J5IDQNCmdncGxvdCh2dkRhdGEsYWVzKGNhdGFsb2dfY29kZV80KSkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgZ2VvbV9iYXIoYWVzKGZpbGw9c29sZCkpDQojUGxvdCAgaXRlbXMgY291bnQgYmFzZWQgb24gY2F0YWxvZyBjYXRlZ29yeSA1DQpnZ3Bsb3QodnZEYXRhLGFlcyhjYXRhbG9nX2NvZGVfNSkpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIGdlb21fYmFyKGFlcyhmaWxsPXNvbGQpKQ0KDQpgYGANCiMjTW9zdCBvZiB0aGUgc2VsbGVycyBhcmUgd29tZW4gYXMgZGVwaWN0ZWQgZnJvbSBwYXN0IGdyYXBocy4gSGVyZSB3ZSBzZWUgbW9zdCBvZiB0aGUgd29tZW4gX3Jvb3QgaXRlbXMgYXJlIG5vdCBzb2xkLiBUaG91Z2ggbWVuIHdlYXIgaGFzIGxlc3MgbGlzdGluZ3MsIHRoZSBzb2xkIHJhdGUgaXMgbmVhcmx5IGVxdWFsIHRvIHdvbWVuIGFuZCBjaGlsZHJlbiB3ZWFyIHdoaWNoIGlzIGFyb3VuZCAyNSBwZXJjZW50Lg0KYGBge3J9DQojQ3JlYXRlIGEgc3Vic2V0IG9mIGRhdGEgdG8gZmluZCBpZiBzZWxsZXIgaXMgSEFQUFkgb3IgTk9UDQpuZXdEYXRhIDwtIHN1YnNldCh2RGF0YSwgc2VsZWN0ID0gLWMocG9ydGFsLGlkLHNhbGVfdGltZSwgZGVjbGluZWRfYXQsZmlyc3RfbGlzdGluZ19sb2NhbF9kYXRlLHJlZ2lzdHJhdGlvbl9wbGF0Zm9ybSxyZWdpc3RyYXRpb25fbG9jYWxfZGF0ZSx3aW5kb3dfaXRlbXNfbGlzdGVkLHdpbmRvd19pdGVtc19ib3VnaHQsd2luZG93X2l0ZW1zX3NvbGQsbGlzdGluZ3NfaW5fZmlyc3RfN2RheXNfZGV0YWlsZWQsbG9zcyxzb2xkKSkNCiNSZW1vdmUgTkEgdmFsdWVzDQpuZXdEYXRhIDwtIG5hLm9taXQobmV3RGF0YSkNCiNUeXBlIGNvbnZlcnNpb24NCm5ld0RhdGEkSGFwcHkgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihuZXdEYXRhJEhhcHB5KSkNCm5ld0RhdGEkc3RhdHVzIDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKG5ld0RhdGEkc3RhdHVzKSkNCm5ld0RhdGEkYnJhbmQgPC0gYXMuaW50ZWdlcihhcy5mYWN0b3IobmV3RGF0YSRicmFuZCkpDQpuZXdEYXRhJGJyYW5kX2lzX3ZlcmlmaWVkIDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKG5ld0RhdGEkYnJhbmRfaXNfdmVyaWZpZWQpKQ0KbmV3RGF0YSRsaXN0aW5nX3F1YWxpdHlfc3RyaW5nIDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKG5ld0RhdGEkbGlzdGluZ19xdWFsaXR5X3N0cmluZykpDQpuZXdEYXRhJGNhdGFsb2dfY29kZV8xIDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKG5ld0RhdGEkY2F0YWxvZ19jb2RlXzEpKQ0KbmV3RGF0YSRjYXRhbG9nX2NvZGVfMiA8LSBhcy5pbnRlZ2VyKGFzLmZhY3RvcihuZXdEYXRhJGNhdGFsb2dfY29kZV8yKSkNCm5ld0RhdGEkY2F0YWxvZ19jb2RlXzMgPC0gYXMuaW50ZWdlcihhcy5mYWN0b3IobmV3RGF0YSRjYXRhbG9nX2NvZGVfMykpDQpuZXdEYXRhJGNhdGFsb2dfY29kZV80IDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKG5ld0RhdGEkY2F0YWxvZ19jb2RlXzQpKQ0KbmV3RGF0YSRjYXRhbG9nX2NvZGVfNSA8LSBhcy5pbnRlZ2VyKGFzLmZhY3RvcihuZXdEYXRhJGNhdGFsb2dfY29kZV81KSkNCm5ld0RhdGEkbGlzdGluZ19wbGF0Zm9ybSA8LSBhcy5pbnRlZ2VyKGFzLmZhY3RvcihuZXdEYXRhJGxpc3RpbmdfcGxhdGZvcm0pKQ0KbmV3RGF0YSRnZW5kZXIgPC0gYXMuaW50ZWdlcihhcy5mYWN0b3IobmV3RGF0YSRnZW5kZXIpKQ0KbmV3RGF0YSRjb2xvcl9wcmltYXJ5IDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKG5ld0RhdGEkY29sb3JfcHJpbWFyeSkpDQpuZXdEYXRhJGNvdW50cnlfY29kZSA8LSBhcy5pbnRlZ2VyKGFzLmZhY3RvcihuZXdEYXRhJGNvdW50cnlfY29kZSkpDQojUHJpbnQgU3VtbWFyeSBvZiBuZXcgc3Vic2V0IGRhdGENCnN1bW1hcnkobmV3RGF0YSkNCmBgYA0KDQoNCmBgYHtyfQ0KI1NwbGl0IHRoZSBkYXRhIGludG8gdHJhaW4gYW5kIHRlc3Qgc2V0DQpzYW1wbGUgPSBzYW1wbGUuc3BsaXQobmV3RGF0YSRIYXBweSwgU3BsaXRSYXRpbyA9IC43MCkNCnRyYWluID0gc3Vic2V0KG5ld0RhdGEsIHNhbXBsZSA9PSBUUlVFKQ0KdGVzdCAgPSBzdWJzZXQobmV3RGF0YSwgc2FtcGxlID09IEZBTFNFKQ0KI1RyYWluIHRoZSBtb2RlbCB1c2luZyB0cmFpbiBkYXRhDQpyZiA8LSByYW5kb21Gb3Jlc3QoSGFwcHkgfiAuLCBkYXRhPXRyYWluKQ0KcmYNCmBgYA0KDQoNCmBgYHtyfQ0KI1Bsb3QgdGhlIFJhbmRvbSBGb3Jlc3QgRXJyb3INCnBsb3QocmYsIG1haW4gPSAiUmFuZG9tIEZvcmVzdCBFcnJvciIpDQpgYGANCg0KYGBge3J9DQojUGxvdCB0aGUgVmFyaWFibGUgSW1wb3J0YW5jZSBQbG90DQp2YXJJbXBQbG90KHJmLCBiZyA9ICJza3libHVlIiwgbWFpbiA9ICJWYXJpYWJsZSBJbXBvcnRhbmNlIFBsb3QgaW4gdGVybXMgb2YgSEFQUFkgb3IgTk9UIikNCmBgYA0KDQojI1RoZSBsaXN0aW5nIHByaWNlLGRlYWwgYWNjZXBldGVkIHByaWNlLCBzb2xkIHBlcmlvZCwgdGhlIHBvc2l0aXZlIGZlZWRjb3VudCBwbGF5cyBhIG1ham9yIHJvbGUgaW4gZGVjaWRpbmcgaWYgdGhlIHNlbGxlciB3YXMgSEFQUFkgb3IgTk9ULg0KIA0KYGBge3J9DQojQ3JlYXRlIGEgc3ViZXQgb2YgZGF0YSB0byBjbGFzc2lmeSBpZiBJdGVtcyB3aGVyZSBTT0xEIG9yIE5PVA0Kc0RhdGEgPC0gc3Vic2V0KHZEYXRhLCBzZWxlY3QgPSAtYyhwb3J0YWwsZGVjbGluZWRfYXQsZmlyc3RfbGlzdGluZ19sb2NhbF9kYXRlLHJlZ2lzdHJhdGlvbl9wbGF0Zm9ybSxyZWdpc3RyYXRpb25fbG9jYWxfZGF0ZSx3aW5kb3dfaXRlbXNfbGlzdGVkLHdpbmRvd19pdGVtc19ib3VnaHQsd2luZG93X2l0ZW1zX3NvbGQsbGlzdGluZ3NfaW5fZmlyc3RfN2RheXNfZGV0YWlsZWQsbG9zcyxpZCxjcmVhdGVkX2F0LHNhbGVfdGltZSxzb2xkX3BlcmlvZCxIYXBweSkpDQojcmVtb3ZlIG5hIHZhbHVlcw0Kc0RhdGEgPC0gbmEub21pdChzRGF0YSkNCiN0eXBlIGNvbnZlcnNpb25zDQpzRGF0YSRzb2xkIDwtIGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoc0RhdGEkc29sZCkpDQpzRGF0YSRzdGF0dXMgPC0gYXMuaW50ZWdlcihhcy5mYWN0b3Ioc0RhdGEkc3RhdHVzKSkNCnNEYXRhJGJyYW5kIDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKHNEYXRhJGJyYW5kKSkNCnNEYXRhJGJyYW5kX2lzX3ZlcmlmaWVkIDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKHNEYXRhJGJyYW5kX2lzX3ZlcmlmaWVkKSkNCnNEYXRhJGxpc3RpbmdfcXVhbGl0eV9zdHJpbmcgPC0gYXMuaW50ZWdlcihhcy5mYWN0b3Ioc0RhdGEkbGlzdGluZ19xdWFsaXR5X3N0cmluZykpDQpzRGF0YSRjYXRhbG9nX2NvZGVfMSA8LSBhcy5pbnRlZ2VyKGFzLmZhY3RvcihzRGF0YSRjYXRhbG9nX2NvZGVfMSkpDQpzRGF0YSRjYXRhbG9nX2NvZGVfMiA8LSBhcy5pbnRlZ2VyKGFzLmZhY3RvcihzRGF0YSRjYXRhbG9nX2NvZGVfMikpDQpzRGF0YSRjYXRhbG9nX2NvZGVfMyA8LSBhcy5pbnRlZ2VyKGFzLmZhY3RvcihzRGF0YSRjYXRhbG9nX2NvZGVfMykpDQpzRGF0YSRjYXRhbG9nX2NvZGVfNCA8LSBhcy5pbnRlZ2VyKGFzLmZhY3RvcihzRGF0YSRjYXRhbG9nX2NvZGVfNCkpDQpzRGF0YSRjYXRhbG9nX2NvZGVfNSA8LSBhcy5pbnRlZ2VyKGFzLmZhY3RvcihzRGF0YSRjYXRhbG9nX2NvZGVfNSkpDQpzRGF0YSRsaXN0aW5nX3BsYXRmb3JtIDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKHNEYXRhJGxpc3RpbmdfcGxhdGZvcm0pKQ0Kc0RhdGEkZ2VuZGVyIDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKHNEYXRhJGdlbmRlcikpDQpzRGF0YSRjb2xvcl9wcmltYXJ5IDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKHNEYXRhJGNvbG9yX3ByaW1hcnkpKQ0Kc0RhdGEkY291bnRyeV9jb2RlIDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKHNEYXRhJGNvdW50cnlfY29kZSkpDQojc3BsaXQgdGhlIGRhdGEgaW50byB0cmFpbiBhbmQgdGVzdCBzZXQNCnNhbXBsZSA9IHNhbXBsZS5zcGxpdChzRGF0YSRzb2xkLCBTcGxpdFJhdGlvID0gLjcwKQ0KdHJhaW4gPSBzdWJzZXQoc0RhdGEsIHNhbXBsZSA9PSBUUlVFKQ0KdGVzdCAgPSBzdWJzZXQoc0RhdGEsIHNhbXBsZSA9PSBGQUxTRSkNCiN0cmFpbiB0aGUgbW9kZWwNCnJmMiA8LSByYW5kb21Gb3Jlc3Qoc29sZCB+IC4sIGRhdGE9dHJhaW4pDQojcGxvdCB0aGUgdmFyaWFibGUgaW1wb3J0YW5jZSBwbG90DQp2YXJJbXBQbG90KHJmMixiZyA9ICJza3libHVlIiwgbWFpbiA9ICJWYXJpYWJsZSBJbXBvcnRhbmNlIFBsb3QgaW4gdGVybXMgb2YgU09MRCBvciBOT1QiKQ0KYGBgDQojI1RoZSBFeHBlcmllbmNlKGxpc3Rlcl9udGhfbGlzdGluZyksIHRvdGFsIHBvc2l0aXZlIGZlZWRiYWNrIGNvdW50LCB0aGUgY29zdCBwcmljZSBhbmQgYnJhbmQgYXJlIHRoZSBQcmltYXJ5IGZhY3RvcnMgd2hpY2ggZGVjaWRlZCBpZiB0aGUgaXRlbSB3YXMgc29sZCBvciBub3QuDQpUaGUgc2Vjb25kYXJ5IGZhY3RvcnMgYXJlIHRoZSBjYXRhbG9nIGNhdGVnb3J5LCBjb2xvciwgbmVnYXRpdmUgZmVlZGJhY2sgY291bnQsIHN0YXR1cyBhbmQgcXVhbGl0eSBvZiBsaXN0aW5nIHN0cmluZy4NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1RoZXJlZm9yZSwgVGhlIHNlbGxlciBtdXN0IG1haW50YWluIGEgZ29vZCBmZWVkYmFjayByZWNvcmQsIG1lbnRpb24gYSBnZW51aW5lIHByaWNlLg0KSXQgd291bGQgYmUgYXBwcmVjaWF0ZWQgaWYgdGVoIHNlbGxlciBjYW4gZ2l2ZSBsb25nIGRlc2NyaXB0aW9uIHdpdGggbW9yZSB0aGFuIDIgcGhvdG9zLg0KVGhpcyB3YXkgdGhlIGxpcXVpZGl0eSBjYW4gYmUgaW5jcmVhc2VkLg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgVGhhbmsgWW91DQoNCg0KDQoNCg0K